package _type

import (
	"database/sql/driver"
	"errors"
	"fmt"
	"strconv"
	"ztool/common"
)

type SnowflakeId string

// Scan 将数据库中取出的数据，赋值给目标类型
func (s *SnowflakeId) Scan(src interface{}) error {

	switch v := src.(type) {
	case int64:
		sv := strconv.FormatInt(v, 10)
		*s = SnowflakeId(sv)
	default:
		return errors.New(fmt.Sprintf("gorm转换雪花ID失败: %v", v))
	}

	return nil
}

// Value 写入数据库之前，对数据做类型转换
func (s SnowflakeId) Value() (driver.Value, error) {
	if len(s) == 0 {
		return nil, errors.New(fmt.Sprintf("gorm Snowflake类型转换失败"))
	}
	return s.toInt64()
}

// SnowflakeIdIsEmpty 是否为空
func (s SnowflakeId) SnowflakeIdIsEmpty() bool {
	sv := string(s)
	return len(sv) == 0 || sv == "0"
}

// toInt64
func (s SnowflakeId) toInt64() (int64, error) {
	return strconv.ParseInt(string(s), 10, 64)
}

// GenerateSnowflakeId 生成 snowflakeid对象
func GenerateSnowflakeId() SnowflakeId {
	return SnowflakeId(strconv.FormatInt(common.NextSnowflakeID(), 10))
}
